import React, { createContext, useContext, useState, useEffect, ReactNode, useCallback } from 'react';

// 权限类型定义
export enum AccessRole {
    Admin = '1',
    Advisor = '2',
    User = '3'
}

// 权限名称映射
export const AccessRoleNames = {
    [AccessRole.Admin]: 'Admin',
    [AccessRole.Advisor]: 'Advisor',
    [AccessRole.User]: 'User'
};

// 权限上下文接口
interface PermissionContextType {
    // 当前用户的权限ID
    accessId: string;
    // 当前用户的权限名称
    accessName: string;
    // 检查是否有特定权限
    hasPermission: (requiredRole: AccessRole | AccessRole[]) => boolean;
    // 检查是否可以编辑基础信息
    canEditBasicInfo: () => boolean;
    // 检查是否可以访问权限管理页面
    canAccessPermissionPage: () => boolean;
    // 检查是否可以使用添加、编辑、删除功能
    canUseEditFeatures: () => boolean;
    // 检查是否可以访问信息导入管理页面
    canAccessImportPage: () => boolean;
    // 检查是否可以访问信息导出管理页面
    canAccessExportPage: () => boolean;
    // 更新权限状态
    updatePermission: () => void;
}

// 创建权限上下文
const PermissionContext = createContext<PermissionContextType | undefined>(undefined);

// 创建一个自定义事件，用于通知权限变更
export const permissionChangeEvent = new Event('permissionChange');

// 权限提供者组件属性
interface PermissionProviderProps {
    children: ReactNode;
}

// 权限提供者组件
export const PermissionProvider: React.FC<PermissionProviderProps> = ({ children }) => {
    // 从本地存储获取用户信息
    const [accessId, setAccessId] = useState<string>('1'); // 默认为管理员权限
    const [accessName, setAccessName] = useState<string>('Admin');

    // 更新权限状态的函数
    const updatePermission = useCallback(() => {
        console.log('更新权限状态');
        const userInfoStr = localStorage.getItem('userInfo');
        if (userInfoStr) {
            try {
                const userInfo = JSON.parse(userInfoStr);
                if (userInfo.access_id) {
                    setAccessId(userInfo.access_id);
                    console.log('更新用户权限ID:', userInfo.access_id);
                }
                if (userInfo.access_name) {
                    setAccessName(userInfo.access_name);    
                    console.log('更新用户权限名称:', userInfo.access_name);
                }
            } catch (error) {
                console.error('解析用户信息失败:', error);
            }
        } else {
            // 如果没有用户信息，设置为默认值
            setAccessId('1');
            setAccessName('Admin');
            console.log('未找到用户信息，设置为默认权限');
        }
    }, []);

    // 初始化时从localStorage获取用户权限信息
    useEffect(() => {
        updatePermission();

        // 添加事件监听器，监听权限变更事件
        window.addEventListener('permissionChange', updatePermission);

        // 清理函数
        return () => {
            window.removeEventListener('permissionChange', updatePermission);
        };
    }, [updatePermission]);

    // 添加调试信息
    useEffect(() => {
        console.log('权限上下文当前权限ID:', accessId);
        console.log('权限上下文当前权限名称:', accessName);
    }, [accessId, accessName]);

    // 检查是否有特定权限
    const hasPermission = (requiredRole: AccessRole | AccessRole[]): boolean => {
        console.log('检查权限:', { 当前权限: accessId, 需要权限: requiredRole });

        if (Array.isArray(requiredRole)) {
            const result = requiredRole.includes(accessId as AccessRole);
            console.log('权限检查结果(数组):', result, '当前权限:', accessId, '需要权限之一:', requiredRole);
            return result;
        }

        const result = accessId === requiredRole;
        console.log('权限检查结果(单个):', result, '当前权限:', accessId, '需要权限:', requiredRole);
        return result;
    };

    // 检查是否可以编辑基础信息
    const canEditBasicInfo = (): boolean => {
        // 只有管理员(1)可以编辑基础信息，顾问(2)和访客(3)不能
        return accessId === AccessRole.Admin;
    };

    // 检查是否可以访问权限管理页面
    const canAccessPermissionPage = (): boolean => {
        // 只有管理员(1)可以访问权限管理页面，顾问(2)和访客(3)不能
        return accessId === AccessRole.Admin;
    };

    // 检查是否可以使用添加、编辑、删除功能
    const canUseEditFeatures = (): boolean => {
        // 管理员(1)和顾问(2)可以使用编辑功能，访客(3)不能
        return accessId === AccessRole.Admin || accessId === AccessRole.Advisor;
    };

    // 检查是否可以访问信息导入管理页面
    const canAccessImportPage = (): boolean => {
        // 只有管理员(1)和顾问(2)可以访问信息导入管理页面，访客(3)不能
        return accessId === AccessRole.Admin || accessId === AccessRole.Advisor;
    };

    // 检查是否可以访问信息导出管理页面
    const canAccessExportPage = (): boolean => {
        // 只有管理员(1)和顾问(2)可以访问信息导出管理页面，访客(3)不能
        return accessId === AccessRole.Admin || accessId === AccessRole.Advisor;
    };

    // 提供上下文值
    const contextValue: PermissionContextType = {
        accessId,
        accessName,
        hasPermission,
        canEditBasicInfo,
        canAccessPermissionPage,
        canUseEditFeatures,
        canAccessImportPage,
        canAccessExportPage,
        updatePermission
    };

    return <PermissionContext.Provider value={contextValue}>{children}</PermissionContext.Provider>;
};

// 自定义Hook，用于在组件中使用权限上下文
export const usePermission = (): PermissionContextType => {
    const context = useContext(PermissionContext);
    if (!context) {
        throw new Error('usePermission must be used within a PermissionProvider');
    }
    return context;
};
